/**
 * Classe Generation :  Porte d'entrée pour la génération du code. Unique classe à contenir TabIdent.
 * 
 * @author BlobbyCompiloTeam
 *
 */
public class Generation implements GramConstants {
	
	private TabIdent table;	// Table des identifiants
	private int offset;			// Offset
	private int type;			// Type courant
	private String ident;		// Identifiant courant
	
	/**
	 * Constructeur de la classe Generation
	 */
	public Generation(){
		offset = -2;
		table = new TabIdent(20);
	}
	
	/**
	 * Accesseur à la table des identifiants
	 * @return table des identifiants
	 */
	public TabIdent getTable() {
		return table;
	}

	/**
	 * Accesseur à l'offset pour les variables locales
	 * @return offset : offset de la variable locale
	 */
	public int getOffset() {
		return offset;
	}

	/**
	 * Modificateur de l'offset pour les variables locales
	 * @param offset : offset de la variable locale
	 */
	public void setOffset(int offset) {
		this.offset = offset;
	}

	/**
	 * Accesseur au type du token courant
	 * @return type : type du token courant
	 */
	public int getType() {
		return type;
	}

	/**
	 * Modificateur du type du token courant
	 * @param type : type du token courant
	 */
	public void setType(int type) {
		this.type = type;
	}

	/**
	 * Accesseur au nom associé à l'Ident courant
	 * @return String : nom de l'ident
	 */
	public String getIdent() {
		return ident;
	}

	/**
	 * Modificateur du nom de l'ident
	 * @param ident : nom de l'ident
	 */
	public void setIdent(String ident) {
		this.ident = ident;
	}

	/**
	 * Déclare une constante entière à partir de l'entier lu. Range l'identifiant associé à la constante créée dans la table des identifiants locaux.
	 */
	public void decl_Const_entier(){
		type = typeEnt;
		int valeur = GramTokenManager.entierLu;
		table.rangeIdentLocaux(ident, new IdConst(type,valeur));		
	}

	/**
	 * Déclare une constante à partir d'un identifiant présent dans la table des globaux. Range l'identifiant associé à la constante créée dans la table des identifiants locaux.
	 */
	public void decl_Const_ident(){
		IdConst id = (IdConst)(table.chercheIdentLocaux(GramTokenManager.identLu));
		int valeur =0;
		if (id==null){
			MsgErreur.getErreur(Gram.token.beginLine, "Generation.decl_Const_ident", "Constante " + GramTokenManager.identLu + " non déclarée");
			type = typeErreur;
		}else{
			type = id.getType();
			valeur = id.getValeur();
		}
		
		table.rangeIdentLocaux(ident, new IdConst(type,valeur));
	}
	
	/**
	 * Déclare une constante booléenne vrai. Range l'identifiant associé à la constante créée dans la table des identifiants locaux.
	 */
	public void decl_Const_vrai(){
		type = typeBool;
		int valeur = -1;
		table.rangeIdentLocaux(ident, new IdConst(type,valeur));
	}

	/**
	 * Déclare une constante booléenne faux. Range l'identifiant associé à la constante créée dans la table des identifiants locaux.
	 */
	public void decl_Const_faux(){
		type = typeBool;
		int valeur = 0;
		table.rangeIdentLocaux(ident, new IdConst(type,valeur));
	}
	
	/**
	 * Déclare une variable à partir de l'ident lu. Range l'identifiant associé à la variable créée dans la table des locaux.
	 */
	public void decl_var()
	{
		table.rangeIdentLocaux(GramTokenManager.identLu,new IdVar(type,offset));
		offset-=2;
	}
		
	/**
	 * Accesseur à l'identifiant courant correspondant à l'ident lu dans la grammaire.
	 * @return Ident : l'ident lu dans la grammaire
	 */
	public Ident ident()
	{
		Ident id = null;
		
		id = (table.chercheIdentLocaux(GramTokenManager.identLu));
		
		if(id==null)
		{
			id = (table.chercheIdentGlobaux(GramTokenManager.identLu));
		}
		
		if(id==null)
		{
			MsgErreur.getErreur(Gram.token.beginLine, "Generation.ident", "Variable " + GramTokenManager.identLu + " non déclarée");
			id = new IdConst(typeErreur, 0);
		}
		
		return id;
	}
	

}
